package com.jacobson.huobi.common.constants

object LinkStatusConstant {

    /** 位运算 constant & {value} == constant */

    /** 低周期联动高周期 标志位 0:否  1:是 */
    private const val SIGN_LOW_LINK_HIGH = 0x00000001L
    /** 高周期联动低周期 标志位 0:否  1:是 */
    private const val SIGN_HIGH_LINK_LOW = 0x00000002L
    /** 本级联动辅助位  标识位 0:否  1:是 */
    private const val SIGN_SELF_LINK_ASSIT = 0x00000004L
    /** 当前Day状态辅助 标识位 0:否  1:是 */
    private const val SIGN_LINK_DAY_ASSIT = 0x00000008L
    /** 实时Link4Kline状态 标识位 0:无  1:实时满足，2、实时不满足，占两位。 */
    private const val SIGN_LINK_4_KLINE_STATUS = 0x00000030L
    /** 控制级联动辅助 标志位 0:否  1:是 */
    private const val SIGN_CONTROL_LINK_ASSIT = 0x00000040L
    /** 控制级联动maB辅助 标志位 0:否  1:是 */
    private const val SIGN_CONTROL_LINK_ASSIT_MAB = 0x00000080L
    /** 持有标识, 操盘线 占四位[0-F], 0-无, 1-3线联动, 2-4线联动, 3-3线空, 4-4线空, 5-顶部震荡, 6-底部震荡, 7-顶中阴, 8-底中阴, F-操盘线计算出错 */
    private const val SIGN_TRADING_LINE: Long = 0x00000F00L
    /** 策略系统错误码，占3位[0-7]，0-未知错误，1-成功，2-K线获取错误，3-指标计算错误，4-策略计算错误, 5-策略系统记录缺失 */
    private const val SIGN_ERROR_CODE: Long = 0x00007000L

    /** 低周期联动高周期 标志位偏移量 */
    private const val OFFSET_LOW_LINK_HIGH: Int = 0
    /** 高周期联动低周期 标志位偏移量 */
    private const val OFFSET_HIGH_LINK_LOW: Int = 1
    /** 本级联动辅助位  标识位偏移量 */
    private const val OFFSET_SELF_LINK_ASSIT: Int = 2
    /** 当前Day状态辅助 标识位偏移量*/
    private const val OFFSET_LINK_DAY_ASSIT: Int = 3
    /** 实时Link4Kline状态 标识位偏移量,状态 */
    private const val OFFSET_LINK_4_KLINE_STATUS: Int = 4
    /** 控制级联动辅助 标志位偏移量 */
    private const val OFFSET_CONTROL_LINK_ASSIT: Int = 6
    /** 控制级联动maB辅助 标志位偏移量 */
    private const val OFFSET_CONTROL_LINK_ASSIT_MAB: Int = 7
    /** 持有标识, 操盘线 占四位[0-F], 0-无, 1-3线联动, 2-4线联动, 3-3线空, 4-4线空, 5-顶部震荡, 6-底部震荡, 7-顶中阴, 8-底中阴, F-操盘线计算出错 */
    private const val OFFSET_TRADING_LINE: Int = 8
    /** 策略系统错误码，占3位[0-7]，0-未知错误，1-成功，2-K线获取错误，3-指标计算错误，4-策略计算错误, 5-策略系统记录缺失 */
    private const val OFFSET_ERROR_CODE: Int = 12
    /**策略报警等级为1H时候该记录是否报警标志*/
    private const val OFFSET_ALARM_LEVEL_H1 :Long= 15
    /**策略报警等级为4H时候该记录是否报警标志*/
    private const val OFFSET_ALARM_LEVEL_H4 :Long= 16
    /**策略报警等级为12H时候该记录是否报警标志*/
    private const val OFFSET_ALARM_LEVEL_H12 :Long= 17
    /**策略报警等级为DAY时候该记录是否报警标志*/
    private const val OFFSET_ALARM_LEVEL_DAY :Long= 18
    /** 操盘线 */
    fun getTradingLineCode(value: Long): Int {
        return (SIGN_TRADING_LINE and value).shr(OFFSET_TRADING_LINE).toInt()
    }
    /** 策略报警标志*/
    fun getAlarmH1Code(value: Long ): Boolean{
        if ((OFFSET_ALARM_LEVEL_H1 and value) == OFFSET_ALARM_LEVEL_H1) {
            return true
        }
        return false
    }
    fun getAlarmH4Code(value: Long ): Boolean{
        if ((OFFSET_ALARM_LEVEL_H4 and value) == OFFSET_ALARM_LEVEL_H4) {
            return true
        }
        return false
    }
    fun getAlarmH12Code(value: Long ): Boolean{
        if ((OFFSET_ALARM_LEVEL_H12 and value) == OFFSET_ALARM_LEVEL_H12) {
            return true
        }
        return false
    }
    fun getAlarmDayCode(value: Long ): Boolean{
        if ((OFFSET_ALARM_LEVEL_DAY and value) == OFFSET_ALARM_LEVEL_DAY) {
            return true
        }
        return false
    }

    /** 获取策略系统错误码 */
    fun getStrategyErrorCode(value: Long): Int {
        return (SIGN_ERROR_CODE and value).shr(OFFSET_ERROR_CODE).toInt()
    }
    fun isLowLinkHigh(value: Long): Boolean {
        if ((SIGN_LOW_LINK_HIGH and value) == SIGN_LOW_LINK_HIGH) {
            return true
        }
        return false
    }

    fun isHighLinkLow(value: Long): Boolean {
        if ((SIGN_HIGH_LINK_LOW and value) == SIGN_HIGH_LINK_LOW) {
            return true
        }
        return false
    }

    fun isSelfLinkAssit(value: Long): Boolean {
        if ((SIGN_SELF_LINK_ASSIT and value) == SIGN_SELF_LINK_ASSIT) {
            return true
        }
        return false
    }

    fun isLinkDayAssit(value: Long): Boolean {
        if ((SIGN_LINK_DAY_ASSIT and value) == SIGN_LINK_DAY_ASSIT) {
            return true
        }
        return false
    }

    fun isControlLinkAssit(value: Long): Boolean {
        if ((SIGN_CONTROL_LINK_ASSIT and value) == SIGN_CONTROL_LINK_ASSIT) {
            return true
        }
        return false
    }

    fun isControlLinkAssitMab(value: Long): Boolean {
        if ((SIGN_CONTROL_LINK_ASSIT_MAB and value) == SIGN_CONTROL_LINK_ASSIT_MAB) {
            return true
        }
        return false
    }

    fun getLink4KLineStatus(value: Long): Int {
        return (value.and(SIGN_LINK_4_KLINE_STATUS).shr(OFFSET_LINK_4_KLINE_STATUS).toInt() % 3)
    }
}